//
//  LWStatusListViewModel.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/13.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit


//这个主要负责tabbleView  这样控制器里面就看起来简单多了
class LWStatusListViewModel: NSObject {
    
    
    //准备一个数组 接收网络返回的数据  这个数组是给整个tabbleviewcell赋值的
    // [LWStatusViewModel] 表示是一个数组 里面的类型都是LWStatusViewModel 类型
    lazy var statusList: [LWStatusViewModel] = [LWStatusViewModel]()
    
    //MARK: - 发送网络请求,获取网络数据
    //需要传递一个是否获取数据成功  成功那么就刷新
    func loadStatus(isPullUp: Bool,callBack: (isSuccess: Bool, message: String) -> ()) {
        
        //需要传递出去的一个可变的字符串 闭包和block内的参数只是需要函数内部需要向外界传递出去的值 我们不能调用这些参数  他们是对外传递数据的接口
        var message: String = "没有加载到最新微博数据"
        
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        
        //第一次进来  如果 isPullUp 是true  那么会走里面的方法  这时的 statusList 是一个nil  还没有赋值 所以就是 ?? 的 0
        if isPullUp { //如果是上拉加载更多
            
            //要获取最后一个cell的id  最后一个cell就是数组的最后一个元素（数组里面的每个元素都对应这每一个cell  因为cell的赋值 就是从statusList中拿的值）
            maxId = self.statusList.last?.status?.id ?? 0
            
            if maxId > 0 {
                
                //解决最后一个cell会重复出现的bug
                maxId -= 1
                
            }

            
        }else { //不是上拉加载  有可能是下拉更新 也有可能是直接显示
            
            
            sinceId = self.statusList.first?.status?.id ?? 0
            
        }
        
        
        
        
        LWNetworkTools.sharedTools.loadStatus(maxId, sinceId: sinceId) { (response, error) -> () in
            
            
            if error != nil { // 失败了
                
                print(error)
                
                callBack(isSuccess: false, message: message)
                
                return
                
            }
            
            
            guard let dic = response as? [String: AnyObject] else {
                
                print("这是一个错误的json形式")
                
                callBack(isSuccess: false, message: message)
                
                return
                
            }
            
            
            
            //到了这里dic就是我们需要的类型 且有值了 那么从字典中取出数组
            guard let statusDicArr = dic["statuses"] as? [[String: AnyObject]] else {
                
                print("这不是一个正确的字典格式")
                
                callBack(isSuccess: false, message: message)
                
                return
                
            }
            
            
          
            //这里statusDicArr就是一个字典数组了  里面都是字典 遍历 将里面的字典转换成模型
            
            
            //可变数组
            var tempArr = [LWStatusViewModel]()
            
            for statusDic in statusDicArr {
                
                let status = LWStatus(dic: statusDic)
                
                let statusViewModel = LWStatusViewModel(status: status)
                
                tempArr.append(statusViewModel)
                
                
            }
            
            
            
            if isPullUp {
                
                //上拉加载更多  就将加载的数据放到数组的最后
                self.statusList += tempArr
  
            }else {
                
                //下拉刷新  就要将最新的数据放到数组最前面
                self.statusList = tempArr + self.statusList
                
                //第二种
//                self.statusList.insertContentsOf(tempArr, at: 0)
                
                if tempArr.count > 0 {
                    
                    message = "加载到了\(tempArr.count)条微博数据"
                    
                }
                
                
            }
            
            
            
            callBack(isSuccess: true, message: message)
            
          
            
        }
        
        
        
        
    }
    

    

}
